' This program exported from BASIC Anywhere Machine (Version [5.2.3].[2024.09.09.00.00]) on 2025.02.23 at 23:22 (Coordinated Universal Time)
' This program by Charlie Veniot is a port of a QBJS program by vince
' vince's program found at: https://qb64phoenix.com/forum/showthread.php?tid=3488&pid=32256#pid32256
DECLARE SUB proj
DECLARE SUB tri(a, b, c)
DECLARE SUB rot(u, rx, ry, rz)
CONST fc& = _RGB(255,255,255) ' white line color
dim xx(4*3), yy(4*3), zz(4*3)
dim x, y, z
dim p, q
dim zoom
dim phi
dim rotx, roty, rotz
rotx = 1
roty = 1
rotz = 1
phi = 0
zoom = 150
dim sw, sh
sw = 800
sh = 600
screen _newimage(sw, sh, 27)
zoom = sh/3
w = 0.5
l = 1
xx(0) = -w
yy(0) = -l
zz(0) = 0
xx(1) = w
yy(1) = -l
zz(1) = 0
xx(2) = w
yy(2) = l
zz(2) = 0
xx(3) = -w
yy(3) = l
zz(3) = 0
for i=0 to 3
x = xx(i)
y = yy(i)
z = zz(i)
rot ( _pi/2, 1,0,0 )
rot ( _pi/2, 0,0,1 )
xx(4 + i) = x
yy(4 + i) = y
zz(4 + i) = z
next
for i=0 to 3
x = xx(i)
y = yy(i)
z = zz(i)
rot ( _pi/2, 0,1,0 )
rot ( _pi/2, 0,0,1 )
xx(8 + i) = x
yy(8 + i) = y
zz(8 + i) = z
next
dim c(2)
c(0) = _rgb(100,0,0)
c(1) = _rgb(0,100,0)
c(2) = _rgb(0,0,100)
for j=0 to 2
color c(j)
x = xx(4*j)
y = yy(4*j)
z = zz(4*j)
proj
preset (sw/2 + p*zoom, sh/2 - q*zoom)
for i=1 to 3
x = xx(4*j + i)
y = yy(4*j + i)
z = zz(4*j + i)
proj
line -(sw/2 + p*zoom, sh/2 - q*zoom)
next
x = xx(4*j)
y = yy(4*j)
z = zz(4*j)
proj
line -(sw/2 + p*zoom, sh/2 - q*zoom)
next
drag = 0
ox = 0
oy = 0
do
phi = phi + 0.01
cls
'minor faces
tri ( 0, 4+0, 1 )
tri ( 0, 1, 4+3 )
tri ( 2, 4+1, 3 )
tri ( 2, 3, 4+2 )
tri ( 4+0, 4+1, 8+1 )
tri ( 4+0, 8+2, 4+1 )
tri ( 4+2, 4+3, 8+0 )
tri ( 4+2, 8+3, 4+3 )
tri ( 8+0, 1, 8+1 )
tri ( 8+2, 0, 8+3 )
tri ( 8+2, 8+3, 3 )
tri ( 8+0, 8+1, 2 )
'major faces
tri (0, 4+3, 8+3 )
tri ( 0, 8+2, 4+0 )
tri ( 1, 8+0, 4+3 )
tri ( 1, 4+0, 8+1 )
tri ( 2, 4+2, 8+0 )
tri ( 3, 8+3, 4+2 )
tri ( 2, 8+1, 4+1 )
tri ( 3, 4+1, 8+2 )
SLEEP 0.001
loop
END
sub proj
d = 10
y0 = 10
rot ( phi, rotx, roty, rotz )
p = x*d/(y0 + y)
q = z*d/(y0 + y)
end sub
sub tri(a, b, c)
'centroid
x = (xx(a) + xx(b) + xx(c))/3
y = (yy(a) + yy(b) + yy(c))/3
z = (zz(a) + zz(b) + zz(c))/3
cx = x
cy = y
cz = z
proj
rcy = y
x = xx(b) - xx(a)
y = yy(b) - yy(a)
z = zz(b) - zz(a)
proj
x1 = x
y1 = y
z1 = z
x = xx(b) - xx(c)
y = yy(b) - yy(c)
z = zz(b) - zz(c)
proj
x2 = x
y2 = y
z2 = z
x1 = xx(b) - xx(a)
y1 = yy(b) - yy(a)
z1 = zz(b) - zz(a)
x2 = xx(b) - xx(c)
y2 = yy(b) - yy(c)
z2 = zz(b) - zz(c)
px = y1*z2 - z1*y2
py = z1*x2 - x1*z2
pz = x1*y2 - y1*x2
x = cx - px
y = cy - py
z = cz - pz
proj
x = px
y = py
z = pz
proj
if y<0.1 then
x = xx(a)
y = yy(a)
z = zz(a)
proj
tx1 = sw/2 + p*zoom
ty1 = sh/2 - q*zoom
x = xx(b)
y = yy(b)
z = zz(b)
proj
tx2 = sw/2 + p*zoom
ty2 = sh/2 - q*zoom
x = xx(c)
y = yy(c)
z = zz(c)
proj
tx3 = sw/2 + p*zoom
ty3 = sh/2 - q*zoom
x = xx(a)
y = yy(a)
z = zz(a)
proj
c = 50 + rcy*100
preset (tx1,ty1)
line -(tx2,ty2), fc&
line -(tx3,ty3), fc&
line -(tx1,ty1), fc&
paintx% = INT([tx1 + tx2 + tx3]/3)
painty% = INT([ty1 + ty2 + ty3]/3)
IF POINT(paintx% + 1, painty%) <> fc& _
AND POINT(paintx% - 1, painty%) <> fc& _
THEN PAINT ( paintx%, painty% ), _rgb(c,c,c), fc&
end if
end sub
sub rot(u, rx, ry, rz)
dd = sqr(rx*rx + ry*ry + rz*rz)
rx = rx/dd
ry = ry/dd
rz = rz/dd
x1 = x
y1 = y
z1 = z
x2 = ry*z - rz*y
y2 = rz*x - rx*z
z2 = rx*y - ry*x
dt = x*rx + y*ry + z*rz
x3 = rx*dt
y3 = ry*dt
z3 = rz*dt
cu = cos(u)
su = sin(u)
x = x1*cu + x2*su + x3*(1 - cu)
y = y1*cu + y2*su + y3*(1 - cu)
z = z1*cu + z2*su + z3*(1 - cu)
end sub